package com.zf.poi.excel.utils;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DateUtil;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Objects;

/**
 * 单元格读取工具
 */
public class CellReadUtils {

    /**
     * 获取单元格的值,转换为字符串
     *
     * @param cell              单元格
     * @param dateTimeFormatter 格式化器
     */
    public static String getCellDataStr(Cell cell, DateTimeFormatter dateTimeFormatter) {
        if (cell == null) {
            return "";
        }
        String cellValue;
        CellType cellType = cell.getCellType();
        switch (cellType) {
            case NUMERIC: // 数字
                if (DateUtil.isCellDateFormatted(cell)) {
                    // 日期
                    LocalDateTime dateTime = cell.getLocalDateTimeCellValue();
                    if (Objects.isNull(dateTimeFormatter)) {
                        cellValue = dateTime.toString();
                    } else {
                        cellValue = dateTimeFormatter.format(dateTime);
                    }
                } else {
                    // 数值 这种用BigDecimal包装再获取plainString，可以防止获取到科学计数值
                    cellValue = BigDecimal.valueOf(cell.getNumericCellValue()).toPlainString();
                }
                break;
            case STRING: // 字符串
                cellValue = cell.getStringCellValue();
                break;
            case BOOLEAN: // Boolean
                cellValue = String.valueOf(cell.getBooleanCellValue());
                break;
            case FORMULA: // 公式
                cellValue = cell.getCellFormula();
                break;
            case _NONE:
            case BLANK: // 空值
            case ERROR: // 故障
                cellValue = "";
                break;
            default:
                cellValue = "";
                break;
        }
        return cellValue;
    }
}
